#include <memory>
#include <iostream>
#include <cstring>
#include <cstdio>

#include "UdpSever.hpp"
#include "Dict.hpp"

static std::vector<std::string> NoSafe_words{
    "rm","mv","cp","kill","sudo","unlink","uninstall","yum","top"
};

void Usage(const char* proc)
{
    std::cout<<"\n\rUsage: "<<proc<<" port[1024+]\n"<<std::endl;
}

// 提供的服务
std::string Echo(const std::string& info)
{
    return info;
}
bool ParseWord(const std::string& command)
{
    for(auto key:NoSafe_words)
    {
        // 找到了则返回下标，找不到这返回string::npos
        size_t pos=command.find(key);
        if(pos!=std::string::npos) return true;
    }
    return false;
}
std::string ExecCommand(const std::string& command)
{
    if(ParseWord(command)) return "Not Premission";

    FILE* fd=popen(command.c_str(),"r");
    char buffer[1024];
    if(fd==nullptr)
    {
        perror("popen error");
        return "error";
    }
    std::string ret;
    while(true)
    {
        // 可以用read，read是一个系统调用，通常用于处理二进制数据  结束返回0
        // 这里次啊用fgets，这是C语言封装的函数，通常用于处理文本内容 结束返回null
        char* p=fgets(buffer,sizeof(buffer),fd);
        if(p==nullptr) break;
        ret+=p;
    }
    pclose(fd);   //使用完了，不要忘记关闭文件描述符
    return ret;
}
int main(int argc,char* argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        exit(0);
    }
    uint16_t port=std::stoi(argv[1]);
    std::unique_ptr<UdpSever> server(new UdpSever(port));
    std::shared_ptr<Dict> dict=std::make_shared<Dict>();

   // std::unique_ptr<UdpSever> sever=std::make_unique<UdpSever>(port);
    server->Init();
    // sever->Run(Echo);
    server->Run([&dict](const std::string& word){
         return dict->Translate(word);
    });
    
    return 0;
}

